﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#if 0
int main() {
	int a = 3, b = 2;
	int ret = 0;
	 ret = a/b;
	printf("%d\n", ret);
	 ret = a % b;
	printf("%d\n", ret);
	double c = 1% 1;
	printf("%f\n", c);
	return 0;
}

int main()
{
	int a,b,c,d,e;
	a = 5;//简单赋值
	a = b = c = d = e = 6;//多个赋值串联在一起
	return 0;
}


int main()
{
	int a = 5;
	if (a == 5)//==表示相等，在if语句里面当作条件使用
		printf("hehe");
	else if (a != 5)//!=表示不相等
		printf("haha");
	return 0;
}

int main()
{
	//前置
	int a = 9;
	int b = ++a;  // 前置++ ：先++，再使用，意思就是：a先++，然后再赋值给b
	printf("a=%d  b=%d\n", a, b);   // a的结果为10 , b的结果也为10
	//如果换种法呢？
	a = 9;
	b = a++;   //后置++ ：先使用，再++。意思就是：先把a赋值给b，然后a再++
	printf("a=%d  b=%d\n", a, b);   //  因此结果就跟上面的不一样了。 a的结果为10，b则为9 
	
	return 0;
}

//条件操作符 
//先来一个基本的操作
int main()
{

	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > 5)
		b = 3;
	else
		b = -3;
	printf("%d\n", b);
	return 0;
}

// 使用条件运算符后的代码：
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d", &a);
	b = a > 5 ? 3 : -3;
	printf("%d\n", b);
	return 0;
}

//逻辑取反运算符！
int main()
{
	int a = 0;
	if (!a)//根据逻辑取反运算符！让原本a=0变成了变成不为0，导致条件成立打印出来hehe
	{
		printf("hehe\n");
	}
	return 0;
}

//与运算符&&
int main()
{
	int n = 15;
	if (n > 0 && n < 18)
		printf("未成年");
//&& 就是与运算符，也是并且的意思， && 是⼀个双⽬操作符，使⽤的⽅式是 a&&b ,
//&& 两边的表达 式都是真的时候，整个表达式才为真，只要有⼀个是假，则整个表达式为假。
	return 0;
}

//或运算符||
int main() {
	int month = 0;
	scanf("%d", &month);
	if (month == 12 || month == 1 || month == 2)
	{
		printf("冬季\n");
	}
	//||就是或运算符，也就是或者的意思,||也是⼀个双⽬操作符，使⽤的⽅式是 a || b ， 
	//两边的表达式只要有⼀个是真，整个表达式就是真，两边的表达式都为假的时候，才为假。
	//只有当month的值为12、1、2中的任意的一个，表达式才成立。
	return 0;
}

#include <stdio.h>

int main()
{
	int num = 10;
	int n = num << 1;
	printf("n= %d\n", n);
	printf("num= %d\n", num);
	return 0;
}

#include <stdio.h>

int main()
{
	int num = 10;
	int n = num >> 1;
	printf("n= %d\n", n);
	printf("num= %d\n", num);
	return 0;
}

//& 按（二进制）位与
int main()
{
	int num1 = 3;  
	int num2 = -5;
	//num1的(补码)为00000000000000000000000000000011
	//num2的(原码)为10000000000000000000000000000101
	 //补码（取反)为11111111111111111111111111111010
	//+1(-5的补码)为11111111111111111111111111111011
	int num3 = num1 & num2;
	printf("%d\n", num3);
		//00000000000000000000000000000011//3
		//11111111111111111111111111111011//-5
//按位与后//num3的值00000000000000000000000000000011//原码（最终结果）3
	
	return 0;
}

//| 按（二进制）位或
int main()
{
	int num1 = 3;
	int num2 = -5;
	//num1的(补码)为00000000000000000000000000000011
	//num2的(原码)为10000000000000000000000000000101
	 //补码（取反)为11111111111111111111111111111010
	//+1(-5的补码)为11111111111111111111111111111011
	int num3 = num1 | num2;
	printf("%d\n", num3);
	//00000000000000000000000000000011//3
	//11111111111111111111111111111011//-5
//按位或后//num3的值11111111111111111111111111111011//(补码)
//取反              10000000000000000000000000000100
//+1                10000000000000000000000000000101//原码（最终结果）-5
	return 0;
}

//^ 按位异或
int main()
{
	int num1 = 3;
	int num2 = -5;
	//num1的(补码)为00000000000000000000000000000011
	//num2的(原码)为10000000000000000000000000000101
	 //补码（取反)为11111111111111111111111111111010
	//+1(-5的补码)为11111111111111111111111111111011
	int num3 = num1 ^ num2;
	printf("%d\n", num3);
	//00000000000000000000000000000011//3
	//11111111111111111111111111111011//-5
//按位异或后//num3的值1111111111111111111111111111000//(补码)
//取反                1000000000000000000000000000111
//+1                  1000000000000000000000000001000//原码（最终结果）-8
	return 0;
}

//~按位取反
int main()
{
	int num1 = 3;
	int num2 = -5;
	//num1的(补码)为00000000000000000000000000000011
	//num2的(原码)为10000000000000000000000000000101
	 //补码（取反)为11111111111111111111111111111010
	//+1(-5的补码)为11111111111111111111111111111011
	int num3 = ~num2;
	printf("%d\n", num3);
	//11111111111111111111111111111011//-5
	//00000000000000000000000000000100//按位取反后//num3的值//4

}

int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式 
	//那c是多少？
	printf("%d\n", c);//13
	//现在括号里面从左到右依次实行，先判断a和b大小，在运行a=b+10,a,b=a+1，
	// 最后c的值是括号的最后一个值。
	return 0;
}

a = get_val();
count_val(a);
while (a > 0)
{
	//业务处理 
	a = get_val();
	count_val(a);
}
//如果使⽤逗号表达式，改写：
while (a = get_val(), count_val(a), a > 0)
{
	//业务处理 
}

void text2(int n)
{
	printf("%d\n", n);
}
int main()
{
	text2(2);
}

// 代码1：变量的定义
struct Point
{
	int x;
	int y;
}p1; //声明类型的同时定义变量p1 

struct Point p2; //定义结构体变量p2 

//代码2:初始化。 
struct Point p3 = { 10, 20 };
struct Stu //类型声明
{
	char name[15];//名字 
	int age; //年龄 
};
struct Stu s1 = { "zhangsan", 20 };//初始化 
struct Stu s2 = { .age = 20, .name = "lisi" };//指定顺序初始化 
//代码3 
struct Node
{
	int data;
	struct Point p;
	struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化 

struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

#include <stdio.h>
struct Point
{
	int x;
	int y;
}p = { 1,2 };

int main()
{
	printf("x: %d y: %d\n", p.x, p.y);
	return 0;
}

#include <stdio.h>

struct Point
{
	int x;
	int y;
};
int main()
{
	struct Point p = { 3, 4 };
	struct Point* ptr = &p;
	ptr->x = 10;
	ptr->y = 20;
	printf("x = %d y = %d\n", ptr->x, ptr->y);
	return 0;
}
#endif
int main()
{
	char a = 3;//char--->signed char（有符号）
	//a的补码是000000000000000000000000000011；
	//char a 是0000011；（因为为char，一个字节）
	char b = 127;
	//b的补码是000000000000000000000001111111；
	//char b 是01111111；
	char c = a + b;
	//先相加
	//000000000000000000000000000011//a
	//000000000000000000000001111111//b
	//000000000000000000000010000010//c
	////char c;

	printf("%d\n", c);//-126
	//%d是以十进制的形式打印有符号的整数
	//c是字符型的，要使用整型提升；
	//111111111111111111111110000010//c提升后的结果（补码）；
	//100000000000000000000011111101//取反
	//100000000000000000000011111111//+1得原码

	return 0;
}